widget: Make helper gesture API take GtkGestures
authorCarlos Garnacho <carlosg@gnome.org>
Mon, 24 Mar 2014 13:35:17 +0000 (14:35 +0100)
committerCarlos Garnacho <carlosg@gnome.org>
Fri, 23 May 2014 17:54:23 +0000 (19:54 +0200)
GtkEventController may be certainly useful to keep event
handling self-contained in other places than gestures, but
the current widget API is highly related to gestures, so
just using GtkGesture as the argument there will be quite
more convenient. The other places where GtkEventController
make sense as a base object will better provide their own
hooks.

gtk/gtkwidget.c
gtk/gtkwidget.h

index a2b1522625b098962e806bc0f85dd33777e20d0e..74df382645ab0740e53edec088429c9527cb7f30 100644 (file)
@@ -398,7 +398,7 @@ typedef struct {
 } GtkWidgetTemplate;
 
 typedef struct {
-  GtkEventController *controller;
+  GtkGesture *controller;
   guint evmask_notify_id;
   guint propagation_phase : 2;
 } EventControllerData;
@@ -7130,7 +7130,7 @@ _gtk_widget_get_controllers_evmask (GtkWidget *widget)
   for (l = priv->event_controllers; l; l = l->next)
     {
       data = l->data;
-      evmask |= gtk_event_controller_get_event_mask (data->controller);
+      evmask |= gtk_event_controller_get_event_mask (GTK_EVENT_CONTROLLER (data->controller));
     }
 
   return evmask;
@@ -7153,7 +7153,8 @@ _gtk_widget_run_controllers (GtkWidget           *widget,
       data = l->data;
 
       if (data->propagation_phase == phase)
-        handled |= gtk_event_controller_handle_event (data->controller, event);
+        handled |= gtk_event_controller_handle_event (GTK_EVENT_CONTROLLER (data->controller),
+                                                      event);
     }
 
   return handled;
@@ -11864,7 +11865,7 @@ gtk_widget_finalize (GObject *object)
   while (priv->event_controllers)
     {
       data = priv->event_controllers->data;
-      gtk_widget_remove_controller (widget, data->controller);
+      gtk_widget_remove_gesture (widget, data->controller);
     }
 
   if (g_object_is_floating (object))
@@ -16538,75 +16539,82 @@ event_controller_notify_event_mask (GtkEventController *controller,
   gtk_widget_add_events_internal (widget, NULL, evmask);
 }
 
-void
-gtk_widget_add_controller (GtkWidget           *widget,
-                           GtkEventController  *controller,
-                           GtkPropagationPhase  phase)
+EventControllerData *
+_gtk_widget_has_gesture (GtkWidget  *widget,
+                         GtkGesture *gesture)
 {
   EventControllerData *data;
   GtkWidgetPrivate *priv;
   GList *l;
 
-  g_return_if_fail (GTK_IS_WIDGET (widget));
-  g_return_if_fail (GTK_IS_EVENT_CONTROLLER (controller));
-  g_return_if_fail (phase >= GTK_PHASE_NONE &&
-                    phase <= GTK_PHASE_BUBBLE);
-
   priv = widget->priv;
 
   for (l = priv->event_controllers; l; l = l->next)
     {
       data = l->data;
+      if (data->controller == gesture)
+        return data;
+    }
 
-      if (data->controller != controller)
-        continue;
+  return NULL;
+}
 
-      data->propagation_phase = phase;
-      return;
-    }
+void
+gtk_widget_add_gesture (GtkWidget           *widget,
+                        GtkGesture          *gesture,
+                        GtkPropagationPhase  phase)
+{
+  EventControllerData *data;
+  GtkWidgetPrivate *priv;
+
+  g_return_if_fail (GTK_IS_WIDGET (widget));
+  g_return_if_fail (GTK_IS_GESTURE (gesture));
+  g_return_if_fail (phase >= GTK_PHASE_NONE &&
+                    phase <= GTK_PHASE_BUBBLE);
+  g_return_if_fail (!_gtk_widget_has_gesture (widget, gesture));
+
+  priv = widget->priv;
 
   data = g_new0 (EventControllerData, 1);
-  data->controller = g_object_ref (controller);
+  data->controller = g_object_ref (gesture);
   data->propagation_phase = phase;
   data->evmask_notify_id =
-    g_signal_connect (controller, "notify::event-mask",
+    g_signal_connect (gesture, "notify::event-mask",
                       G_CALLBACK (event_controller_notify_event_mask), widget);
 
   priv->event_controllers = g_list_prepend (priv->event_controllers, data);
 }
 
 void
-gtk_widget_remove_controller (GtkWidget           *widget,
-                              GtkEventController  *controller)
+gtk_widget_remove_gesture (GtkWidget  *widget,
+                           GtkGesture *gesture)
 {
   EventControllerData *data;
   GtkWidgetPrivate *priv;
-  GList *l;
 
   g_return_if_fail (GTK_IS_WIDGET (widget));
-  g_return_if_fail (GTK_IS_EVENT_CONTROLLER (controller));
+  g_return_if_fail (GTK_IS_GESTURE (gesture));
 
   priv = widget->priv;
+  data = _gtk_widget_has_gesture (widget, gesture);
 
-  for (l = priv->event_controllers; l; l = l->next)
-    {
-      data = l->data;
+  if (!data)
+    return;
 
-      if (data->controller != controller)
-        continue;
+  priv->event_controllers = g_list_remove (priv->event_controllers, data);
 
-      gtk_event_controller_reset (data->controller);
-      g_signal_handler_disconnect (data->controller, data->evmask_notify_id);
-      g_object_unref (data->controller);
-      g_free (data);
-      priv->event_controllers = g_list_delete_link (priv->event_controllers, l);
-      return;
-    }
+  if (g_signal_handler_is_connected (widget, data->grab_notify_id))
+    g_signal_handler_disconnect (widget, data->grab_notify_id);
+
+  g_signal_handler_disconnect (data->controller, data->evmask_notify_id);
+  gtk_event_controller_reset (GTK_EVENT_CONTROLLER (data->controller));
+  g_object_unref (data->controller);
+  g_free (data);
 }
 
 GList *
-gtk_widget_list_controllers (GtkWidget           *widget,
-                             GtkPropagationPhase  phase)
+gtk_widget_list_gestures (GtkWidget           *widget,
+                          GtkPropagationPhase  phase)
 {
   EventControllerData *data;
   GtkWidgetPrivate *priv;
@@ -16646,12 +16654,7 @@ gtk_widget_get_sequence_state (GtkWidget        *widget,
   for (l = priv->event_controllers; l; l = l->next)
     {
       data = l->data;
-
-      if (!GTK_IS_GESTURE (data->controller))
-        continue;
-
-      state = gtk_gesture_get_sequence_state (GTK_GESTURE (data->controller),
-                                              sequence);
+      state = gtk_gesture_get_sequence_state (data->controller, sequence);
       if (state != GTK_EVENT_SEQUENCE_NONE)
         return state;
     }
@@ -16664,10 +16667,8 @@ gtk_widget_set_sequence_state (GtkWidget             *widget,
                                GdkEventSequence      *sequence,
                                GtkEventSequenceState  state)
 {
-  EventControllerData *data;
   gboolean handled = FALSE;
   GtkWidget *event_widget;
-  GtkWidgetPrivate *priv;
   const GdkEvent *event;
 
   g_return_if_fail (GTK_IS_WIDGET (widget));
@@ -16680,16 +16681,12 @@ gtk_widget_set_sequence_state (GtkWidget             *widget,
   if (!handled)
     return;
 
-  priv = widget->priv;
-  data = priv->event_controllers->data;
-  event = gtk_gesture_get_last_event (GTK_GESTURE (data->controller), sequence);
+  event = _gtk_widget_get_last_event (widget, sequence);
 
   if (!event)
     return;
 
   event_widget = gtk_get_event_widget ((GdkEvent *) event);
-  g_assert (widget == event_widget ||
-            gtk_widget_is_ancestor (event_widget, widget));
 
   while (event_widget)
     {
index f3b2cf0d23bd3baae82a762ab4155dd1b0b17fa3..5795865bdd63985ee54166665b42449bf77b3989 100644 (file)
@@ -33,7 +33,7 @@
 #include <gtk/gtkaccelgroup.h>
 #include <gtk/gtkborder.h>
 #include <gtk/gtktypes.h>
-#include <gtk/gtkeventcontroller.h>
+#include <gtk/gtkgesture.h>
 #include <atk/atk.h>
 
 G_BEGIN_DECLS
@@ -1471,14 +1471,14 @@ void    gtk_widget_class_bind_template_child_full       (GtkWidgetClass        *
                                                         gssize                 struct_offset);
 
 GDK_AVAILABLE_IN_3_14
-void    gtk_widget_add_controller                       (GtkWidget           *widget,
-                                                         GtkEventController  *controller,
+void    gtk_widget_add_gesture                          (GtkWidget           *widget,
+                                                         GtkGesture          *gesture,
                                                          GtkPropagationPhase  phase);
 GDK_AVAILABLE_IN_3_14
-void    gtk_widget_remove_controller                    (GtkWidget           *widget,
-                                                         GtkEventController  *controller);
+void    gtk_widget_remove_gesture                       (GtkWidget           *widget,
+                                                         GtkGesture          *gesture);
 GDK_AVAILABLE_IN_3_14
-GList * gtk_widget_list_controllers                     (GtkWidget           *widget,
+GList * gtk_widget_list_gestures                        (GtkWidget           *widget,
                                                          GtkPropagationPhase  phase);
 
 GDK_AVAILABLE_IN_3_14